# 1.列表list_1 = [[1,2,3,4,5],[{“name”:”张三”,”age”:28},{“name”:”James”,”age”:30}]] ,
# 获取James的年龄
#
# list_1 = [[1,2,3,4,5],[{'name':'张三','age':28},{'name':'James','age':30}]]
# James_age = list_1[1][1]['age']
# print(James_age)
#
# 2.名词解释: 可迭代对象、迭代器、生成器、装饰器
#  可以返回一个迭代器的对象就是可迭代对象，大部分的容器对象是可迭代对象
#  迭代器：迭代器是一种可以记住遍历的位置的对象，迭代器对象从集合的第一个元素开始访问，直到所有的元素被访问完结束。
#  生成器：使用了yeild的函数就叫生成器
#  装饰器：将一个函数作为参数传递进去，并将以编程人员想要的功能赋予给该函数，相当于给一个函数添加功能

# 3.名词解释：面向对象编程中“类”中有几种方法？分别解释各种方法的用途。
# 有实例方法，类方法，静态方法。
# 实例方法:实例方法是必须创建了一个类的实例之后才能调用的方法，属于一个特定的实例。
# 实例方法隐含的参数为类实例self

# 类方法：是将类本身作为对象进行操作的方法，类和类的实例都可以使用。
# 类方法隐含的参数为类本身cls。
#
# 静态方法：和类基本没关系的一个独立的方法，类和类的实例都可以使用。
# 静态方法无隐含参数，主要为了类实例也可以直接调用静态方法。
#
# 4.输出以下代码运行结果，解释变量作用域LEGB.
#
# x = 2  #全局作用域
# z = 3  #全局作用域
# def func_outer():
#     y = 9  # 闭包函数外的函数中
#     x = 0  # 闭包函数外的函数中
#     global z  # 修改全局作用域的变量需要用global关键字来声明
#     def func_inner():
#         nonlocal x # 修改闭包函数外的函数中的变量使用nonlocal来声明
#         x += 5 # 局部作用域
#         z = 6  # 局部作用域
#         print('func_inner',max(x,z))
#     z += 3
#     x += 2
#     print(x,y,z)
#     return func_inner
# func_outer()()
# L - 局部作用域
# E - 闭包函数外的函数中
# G - 全局作用域
# B - 内建作用域
#
# 5.解释什么是GIL(全局解释器锁)
# GIL就是使python解释器只能运行一个线程的代码，在多线程的情况下只有当一个线程获得了一个全局解释器锁的权限的时候
# 该代码才能运行，因此就算计算机有多核也只能发挥出单核的性能。
#
#
# 6.什么是线程、协程、进程
# 进程是计算机中的程序关于某数据集合上的一次运行活动，是系统进行资源分配和调度的基本单位，是操作系统结构的基础。
# 它可以申请和拥有系统资源，是一个动态的概念，是一个活动的实体。
#
# 线程是进程中的一个实体，是被系统独立调度和分派的基本单位，是程序执行流的最小单元。线程自己不拥有系统资源，
# 只拥有一点儿在运行中必不可少的资源，但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
#
# 协程是一种用户态的轻量级线程，协程的调度完全由用户控制。一个程序可以包含多个协程
#
# 7.什么时候该用多线程、什么情况该用多进程
# 多进程:1.数据共享复杂，需要用IPC；数据是分开的，同步简单
#       2.占用内存多，切换复杂，CPU利用率低
#       3.创建销毁、切换复杂，速度慢
#       4.编程简单，调试简单
#       5.进程间不会互相影响
#       6.适应于多核、多机分布式；如果一台机器不够，扩展到多台机器比较简单
# 多线程：1.因为共享进程数据，数据共享简单，但也是因为这个原因导致同步复杂
#       2.占用内存少，切换简单，CPU利用率高
#       3.创建销毁、切换简单，速度很快
#       4.编程复杂，调试复杂
#       5.一个线程挂掉将导致整个进程挂掉
#       6.适应于多核分布式
# 综上：数据共享、同步的时候进程线程各有优缺点如果想要数据共享简单则选线程
#      想要同步简单就选择进程。需要频繁创建销毁的时候优先用线程。需要进行
#      大量计算的优先使用线程。可能要扩展到多机分布的用进程，多核分布的用
#      线程
# 8.多个进程间如何通信？（注意多进程知识点回顾！！！）
# 进程间的通讯方式有管道，信号量，消息队列，信号，共享内存，套接字。
# 套接字来进行多进程的通信步骤为,先设定socket对象然后进行绑定，监听
# ，连接服务器，相互发送接收数据，断开连接。